package com.acmen.easyapi.factory;

import org.apache.tomcat.util.collections.CaseInsensitiveKeyMap;
import org.springframework.beans.factory.InitializingBean;

import java.lang.reflect.Type;
import java.util.Map;

/**
 * @author acmen
 * `ClassAliasFactory` 类别名工厂
 */
public abstract class ClassAliasFactory implements InitializingBean {
    private static Map<String,String> aliasMap = new CaseInsensitiveKeyMap<>();

    /**
     * 初始化类别名映射关系
     * @param aliasMap 类别名映射关系
     */
    protected abstract void init(Map<String, String> aliasMap);

    /**
     * 获取类别名
     * @param type 类型
     * @return 类别名
     */
    public static String getAlias(Type type){
        return getAlias(type.getTypeName());
    }

    /**
     * 获取类别名
     * @param typeName 类型名称
     * @return 类别名
     */
    public static String getAlias(String typeName){
        String alias = aliasMap.get(typeName);  // 获取给定类型名称的别名
        if(alias!=null){
            return alias;  // 如果别名存在，则返回别名
        }
        int idx = typeName.lastIndexOf(".");  // 获取类型名称中最后一个点的索引
        if(idx>-1){
            typeName = typeName.substring(idx+1);  // 如果存在点，则去掉点之前的字符串，只保留点之后的字符串
        }
        alias = aliasMap.get(typeName);  // 获取经过处理后的类型名称的别名
        if(alias==null){
            alias = "Object";  // 如果别名不存在，则将别名设置为"Object"
        }
        return alias;  // 返回最终的别名

    }

    @Override
    public void afterPropertiesSet() throws Exception {
        init(aliasMap);
    }
}
